package com.webber.demo.common.utils;


 
 import java.io.UnsupportedEncodingException;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Set;
 import net.sourceforge.pinyin4j.PinyinHelper;
 import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
 import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
 import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
 import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
 import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
 * 中文转拼音工具类
 * @author 
 *
 */
 public class CnToSpell {
   private static LinkedHashMap spellMap = null;
   
   static { if (spellMap == null) {
       spellMap = new LinkedHashMap(400);
     }
     initialize();
     System.out.println("Chinese transfer Spell Done.");
   }
   private static void spellPut(String spell, int ascii)   {
     spellMap.put(spell, new Integer(ascii));
   }
   
   private static void initialize() {
     spellPut("a", 45217);
     spellPut("ai", 45219);
     spellPut("an", 45232);
     spellPut("ang", 45241);
     spellPut("ao", 45244);
     spellPut("ba", 45253);
     spellPut("bai", 45271);
     spellPut("ban", 45279);
     spellPut("bang", 45294);
     spellPut("bao", 45306);
     spellPut("bei", 45485);
     spellPut("ben", 45500);
     spellPut("beng", 45504);
     spellPut("bi", 45510);
     spellPut("bian", 45534);
     spellPut("biao", 45546);
     spellPut("bie", 45550);
     spellPut("bin", 45554);
     spellPut("bing", 45560);
     spellPut("bo", 45731);
     spellPut("bu", 45752);
     spellPut("ca", 45761);
     spellPut("cai", 45762);
     spellPut("can", 45773);
     spellPut("cang", 45780);
     spellPut("cao", 45785);
     spellPut("ce", 45790);
     spellPut("ceng", 45795);
     spellPut("cha", 45797);
     spellPut("chai", 45808);
     spellPut("chan", 45811);
     spellPut("chang", 45821);
     spellPut("chao", 45996);
     spellPut("che", 46005);
     spellPut("chen", 46011);
     spellPut("cheng", 46021);
     spellPut("chi", 46036);
     spellPut("chong", 46052);
     spellPut("chou", 46057);
     spellPut("chu", 46069);
     spellPut("chuai", 46247);
     spellPut("chuan", 46248);
     spellPut("chuang", 46255);
     spellPut("chui", 46261);
     spellPut("chun", 46266);
     spellPut("chuo", 46273);
     spellPut("ci", 46275);
     spellPut("cong", 46287);
     spellPut("cou", 46293);
     spellPut("cu", 46294);
     spellPut("cuan", 46298);
     spellPut("cui", 46301);
     spellPut("cun", 46309);
     spellPut("cuo", 46312);
     spellPut("da", 46318);
     spellPut("dai", 46324);
     spellPut("dan", 46498);
     spellPut("dang", 46513);
     spellPut("dao", 46518);
     spellPut("de", 46530);
     spellPut("deng", 46533);
     spellPut("di", 46540);
     spellPut("dian", 46559);
     spellPut("diao", 46575);
     spellPut("die", 46584);
     spellPut("ding", 46753);
     spellPut("diu", 46762);
     spellPut("dong", 46763);
     spellPut("dou", 46773);
     spellPut("du", 46780);
     spellPut("duan", 46795);
     spellPut("dui", 46801);
     spellPut("dun", 46805);
     spellPut("duo", 46814);
     spellPut("e", 46826);
     spellPut("en", 46839);
     spellPut("er", 46840);
     spellPut("fa", 47010);
     spellPut("fan", 47018);
     spellPut("fang", 47035);
     spellPut("fei", 47046);
     spellPut("fen", 47058);
     spellPut("feng", 47073);
     spellPut("fo", 47088);
     spellPut("fou", 47089);
     spellPut("fu", 47090);
     spellPut("ga", 47297);
     spellPut("gai", 47299);
     spellPut("gan", 47305);
     spellPut("gang", 47316);
     spellPut("gao", 47325);
     spellPut("ge", 47335);
     spellPut("gei", 47352);
     spellPut("gen", 47353);
     spellPut("geng", 47355);
     spellPut("gong", 47524);
     spellPut("gou", 47539);
     spellPut("gu", 47548);
     spellPut("gua", 47566);
     spellPut("guai", 47572);
     spellPut("guan", 47575);
     spellPut("guang", 47586);
     spellPut("gui", 47589);
     spellPut("gun", 47605);
     spellPut("guo", 47608);
     spellPut("ha", 47614);
     spellPut("hai", 47777);
     spellPut("han", 47784);
     spellPut("hang", 47803);
     spellPut("hao", 47806);
     spellPut("he", 47815);
     spellPut("hei", 47833);
     spellPut("hen", 47835);
     spellPut("heng", 47839);
     spellPut("hong", 47844);
     spellPut("hou", 47853);
     spellPut("hu", 47860);
     spellPut("hua", 48040);
     spellPut("huai", 48049);
     spellPut("huan", 48054);
     spellPut("huang", 48068);
     spellPut("hui", 48082);
     spellPut("hun", 48103);
     spellPut("huo", 48109);
     spellPut("ji", 48119);
     spellPut("jia", 48334);
     spellPut("jian", 48351);
     spellPut("jiang", 48553);
     spellPut("jiao", 48566);
     spellPut("jie", 48594);
     spellPut("jin", 48621);
     spellPut("jing", 48803);
     spellPut("jiong", 48828);
     spellPut("jiu", 48830);
     spellPut("ju", 48847);
     spellPut("juan", 48872);
     spellPut("jue", 48879);
     spellPut("jun", 48889);
     spellPut("ka", 49062);
     spellPut("kai", 49066);
     spellPut("kan", 49071);
     spellPut("kang", 49077);
     spellPut("kao", 49084);
     spellPut("ke", 49088);
     spellPut("ken", 49103);
     spellPut("keng", 49107);
     spellPut("kong", 49109);
     spellPut("kou", 49113);
     spellPut("ku", 49117);
     spellPut("kua", 49124);
     spellPut("kuai", 49129);
     spellPut("kuan", 49133);
     spellPut("kuang", 49135);
     spellPut("kui", 49143);
     spellPut("kun", 49316);
     spellPut("kuo", 49320);
     spellPut("la", 49324);
     spellPut("lai", 49331);
     spellPut("lan", 49334);
     spellPut("lang", 49349);
     spellPut("lao", 49356);
     spellPut("le", 49365);
     spellPut("lei", 49367);
     spellPut("leng", 49378);
     spellPut("li", 49381);
     spellPut("lia", 49577);
     spellPut("lian", 49578);
     spellPut("liang", 49592);
     spellPut("liao", 49603);
     spellPut("lie", 49616);
     spellPut("lin", 49621);
     spellPut("ling", 49633);
     spellPut("liu", 49647);
     spellPut("long", 49658);
     spellPut("lou", 49829);
     spellPut("lu", 49835);
     spellPut("lv", 49855);
     spellPut("luan", 49869);
     spellPut("lue", 49875);
     spellPut("lun", 49877);
     spellPut("luo", 49884);
     spellPut("ma", 49896);
     spellPut("mai", 49905);
     spellPut("man", 49911);
     spellPut("mang", 50082);
     spellPut("mao", 50088);
     spellPut("me", 50100);
     spellPut("mei", 50101);
     spellPut("men", 50117);
     spellPut("meng", 50120);
     spellPut("mi", 50128);
     spellPut("mian", 50142);
     spellPut("miao", 50151);
     spellPut("mie", 50159);
     spellPut("min", 50161);
     spellPut("ming", 50167);
     spellPut("miu", 50173);
     spellPut("mo", 50174);
     spellPut("mou", 50353);
     spellPut("mu", 50356);
     spellPut("na", 50371);
     spellPut("nai", 50378);
     spellPut("nan", 50383);
     spellPut("nang", 50386);
     spellPut("nao", 50387);
     spellPut("ne", 50392);
     spellPut("nei", 50393);
     spellPut("nen", 50395);
     spellPut("neng", 50396);
     spellPut("ni", 50397);
     spellPut("nian", 50408);
     spellPut("niang", 50415);
     spellPut("niao", 50417);
     spellPut("nie", 50419);
     spellPut("nin", 50426);
     spellPut("ning", 50427);
     spellPut("niu", 50595);
     spellPut("nong", 50599);
     spellPut("nu", 50603);
     spellPut("nv", 50606);
     spellPut("nuan", 50607);
     spellPut("nue", 50608);
     spellPut("nuo", 50610);
     spellPut("o", 50614);
     spellPut("ou", 50615);
     spellPut("pa", 50622);
     spellPut("pai", 50628);
     spellPut("pan", 50634);
     spellPut("pang", 50642);
     spellPut("pao", 50647);
     spellPut("pei", 50654);
     spellPut("pen", 50663);
     spellPut("peng", 50665);
     spellPut("pi", 50679);
     spellPut("pian", 50858);
     spellPut("piao", 50862);
     spellPut("pie", 50866);
     spellPut("pin", 50868);
     spellPut("ping", 50873);
     spellPut("po", 50882);
     spellPut("pu", 50891);
     spellPut("qi", 50906);
     spellPut("qia", 50942);
     spellPut("qian", 51107);
     spellPut("qiang", 51129);
     spellPut("qiao", 51137);
     spellPut("qie", 51152);
     spellPut("qin", 51157);
     spellPut("qing", 51168);
     spellPut("qiong", 51181);
     spellPut("qiu", 51183);
     spellPut("qu", 51191);
     spellPut("quan", 51366);
     spellPut("que", 51377);
     spellPut("qun", 51385);
     spellPut("ran", 51387);
     spellPut("rang", 51391);
     spellPut("rao", 51396);
     spellPut("re", 51399);
     spellPut("ren", 51401);
     spellPut("reng", 51411);
     spellPut("ri", 51413);
     spellPut("rong", 51414);
     spellPut("rou", 51424);
     spellPut("ru", 51427);
     spellPut("ruan", 51437);
     spellPut("rui", 51439);
     spellPut("run", 51442);
     spellPut("ruo", 51444);
     spellPut("sa", 51446);
     spellPut("sai", 51449);
     spellPut("san", 51453);
     spellPut("sang", 51619);
     spellPut("sao", 51622);
     spellPut("se", 51626);
     spellPut("sen", 51629);
     spellPut("seng", 51630);
     spellPut("sha", 51631);
     spellPut("shai", 51640);
     spellPut("shan", 51642);
     spellPut("shang", 51658);
     spellPut("shao", 51666);
     spellPut("she", 51677);
     spellPut("shen", 51689);
     spellPut("sheng", 51705);
     spellPut("shi", 51878);
     spellPut("shou", 51925);
     spellPut("shu", 51935);
     spellPut("shua", 52130);
     spellPut("shuai", 52132);
     spellPut("shuan", 52136);
     spellPut("shuang", 52138);
     spellPut("shui", 52141);
     spellPut("shun", 52145);
     spellPut("shuo", 52149);
     spellPut("si", 52153);
     spellPut("song", 52169);
     spellPut("sou", 52177);
     spellPut("su", 52180);
     spellPut("suan", 52193);
     spellPut("sui", 52196);
     spellPut("sun", 52207);
     spellPut("suo", 52210);
     spellPut("ta", 52218);
     spellPut("tai", 52389);
     spellPut("tan", 52398);
     spellPut("tang", 52416);
     spellPut("tao", 52429);
     spellPut("te", 52440);
     spellPut("teng", 52441);
     spellPut("ti", 52445);
     spellPut("tian", 52460);
     spellPut("tiao", 52468);
     spellPut("tie", 52473);
     spellPut("ting", 52476);
     spellPut("tong", 52648);
     spellPut("tou", 52661);
     spellPut("tu", 52665);
     spellPut("tuan", 52676);
     spellPut("tui", 52678);
     spellPut("tun", 52684);
     spellPut("tuo", 52687);
     spellPut("wa", 52698);
     spellPut("wai", 52705);
     spellPut("wan", 52707);
     spellPut("wang", 52724);
     spellPut("wei", 52734);
     spellPut("wen", 52929);
     spellPut("weng", 52939);
     spellPut("wo", 52942);
     spellPut("wu", 52951);
     spellPut("xi", 52980);
     spellPut("xia", 53177);
     spellPut("xian", 53190);
     spellPut("xiang", 53216);
     spellPut("xiao", 53236);
     spellPut("xie", 53416);
     spellPut("xin", 53437);
     spellPut("xing", 53447);
     spellPut("xiong", 53462);
     spellPut("xiu", 53469);
     spellPut("xu", 53478);
     spellPut("xuan", 53497);
     spellPut("xue", 53669);
     spellPut("xun", 53675);
     spellPut("ya", 53689);
     spellPut("yan", 53705);
     spellPut("yang", 53738);
     spellPut("yao", 53755);
     spellPut("ye", 53932);
     spellPut("yi", 53947);
     spellPut("yin", 54000);
     spellPut("ying", 54178);
     spellPut("yo", 54196);
     spellPut("yong", 54197);
     spellPut("you", 54212);
     spellPut("yu", 54233);
     spellPut("yuan", 54439);
     spellPut("yue", 54459);
     spellPut("yun", 54469);
     spellPut("za", 54481);
     spellPut("zai", 54484);
     spellPut("zan", 54491);
     spellPut("zang", 54495);
     spellPut("zao", 54498);
     spellPut("ze", 54512);
     spellPut("zei", 54516);
     spellPut("zen", 54517);
     spellPut("zeng", 54518);
     spellPut("zha", 54522);
     spellPut("zhai", 54698);
     spellPut("zhan", 54704);
     spellPut("zhang", 54721);
     spellPut("zhao", 54736);
     spellPut("zhe", 54746);
     spellPut("zhen", 54756);
     spellPut("zheng", 54772);
     spellPut("zhi", 54949);
     spellPut("zhong", 54992);
     spellPut("zhou", 55003);
     spellPut("zhu", 55017);
     spellPut("zhua", 55205);
     spellPut("zhuai", 55207);
     spellPut("zhuan", 55208);
     spellPut("zhuang", 55214);
     spellPut("zhui", 55221);
     spellPut("zhun", 55227);
     spellPut("zhuo", 55229);
     spellPut("zi", 55240);
     spellPut("zong", 55255);
     spellPut("zou", 55262);
     spellPut("zu", 55266);
     spellPut("zuan", 55274);
     spellPut("zui", 55276);
     spellPut("zun", 55280);
     spellPut("zuo", 55282);
   }
   public static int getCnAscii(char cn)
   {
     byte[] bytes = null;
    try {
      bytes = String.valueOf(cn).getBytes("GB2312");
    }
    catch (UnsupportedEncodingException ex) {}
    if ((bytes == null) || (bytes.length > 2) || (bytes.length <= 0)) {
      return 0;
     }
     if (bytes.length == 1) {
       return bytes[0];
    }
     if (bytes.length == 2) {
       int hightByte = 256 + bytes[0];
       int lowByte = 256 + bytes[1];
       int ascii = 256 * hightByte + lowByte - 65536;
       
       return ascii;
     }
     return 0;
   }
   public static String getSpellByAscii(int ascii)
   {
     if ((ascii > 0) && (ascii < 160)) {
       return String.valueOf((char)ascii);
    }
     if ((ascii < 45217) || (ascii > 55289)) {
       return null;
    }
     Set keySet = spellMap.keySet();
    Iterator it = keySet.iterator();
     String spell0 = null;
    
     String spell = null;
     int asciiRang0 = 45217;
     
    while (it.hasNext()) {
      spell = (String)it.next();
      Object valObj = spellMap.get(spell);
       if ((valObj instanceof Integer)) {
        int asciiRang = ((Integer)valObj).intValue();
         if ((ascii >= asciiRang0) && (ascii < asciiRang)) {
           return spell0 == null ? spell : spell0;
         }
         spell0 = spell;
         asciiRang0 = asciiRang;
       }
    }     
    return null;
   }
   private static boolean isAlphabet(int ascii)
   {
     if ((ascii > 0) && (ascii < 160)) {
       return true;
     }
     return false;
   }
  @Deprecated
   public static String getFullSpell(String cnStr)
   {
     if ((null == cnStr) || ("".equals(cnStr.trim()))) {
       return cnStr;
     }
     boolean isChinese = false;
     char[] chars = cnStr.toCharArray();
     StringBuilder retuBuf = new StringBuilder();
     StringBuilder resultBuf = new StringBuilder();
     int i = 0; for (int Len = chars.length; i < Len; i++) {
       int ascii = getCnAscii(chars[i]);
       if (ascii == 0) {
         retuBuf.append(chars[i]);
       } 
       else {
         String spell = getSpellByAscii(ascii);
         if (spell == null) {
           retuBuf.append(chars[i]);
         }
        else {
          retuBuf.append(spell);
         }
         if (!isAlphabet(ascii)) {
           isChinese = true;
          retuBuf.append("");
    }
    if (isChinese)
     {
       resultBuf.append("");
      resultBuf.append(retuBuf.toString());
     } else {
       resultBuf.append(retuBuf.toString());
     }
       
     return resultBuf.toString();
    
   }
     }
	return cnStr;
   }
   public static String getFirstSpell(String cnStr) {
     return null;
   }
   public static String getPinYin(String cnStr)
     throws BadHanyuPinyinOutputFormatCombination
   {
     char[] cnChars = cnStr.toCharArray();
     String[] arrayOfString = null;
     
     HanyuPinyinOutputFormat localHanyuPinyinOutputFormat = new HanyuPinyinOutputFormat();
     localHanyuPinyinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
     localHanyuPinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
     localHanyuPinyinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
    String resultStr = "";
     
    for (int i = 0; i < cnChars.length; i++)
    {
      if (Character.toString(cnChars[i]).matches("[\\u4E00-\\u9FA5]+"))
       {
         arrayOfString = PinyinHelper.toHanyuPinyinStringArray(cnChars[i], localHanyuPinyinOutputFormat);
         resultStr = resultStr + arrayOfString[0];
       }
       else {
       resultStr = resultStr + Character.toString(cnChars[i]);
       }
     }
     return resultStr;
  }
}


